#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>


void sair(FILE * arquivo){
	fclose(arquivo);
	exit(EXIT_SUCCESS);
}

int main(){
	char * nome_arquivo = calloc(256,sizeof(char));
	nome_arquivo = fgets(nome_arquivo,255,stdin);
	if(nome_arquivo == NULL){
		exit(EXIT_FAILURE);
	}
	{
 	register int i;
	 for(i=0;i<256;++i){
			if(nome_arquivo[i] == '\n'){
				nome_arquivo[i] = '\0';
			}
		}
	}
	FILE * arquivo = fopen(nome_arquivo,"r+");
	if(arquivo == NULL){
		exit(EXIT_FAILURE);
	}
	printf("Arquivo %s aberto.\n",nome_arquivo);
	FILE * const err = arquivo;
	char caractere = '\0';
	bool nova_linha = true,bloco_comentario = false;
	do{
		caractere = fgetc(arquivo);
		fseek(arquivo,-1,SEEK_CUR);
		if(!bloco_comentario){
			//descubra se há um
			//bloco de comentários
			if(caractere == '/'){
				//leia o próximo e deixe arquivo
				//apontando para o caractere lido
				fseek(arquivo,1,SEEK_CUR);
				caractere = fgetc(arquivo);
				fseek(arquivo,-1,SEEK_CUR);
				if(caractere == EOF){
					sair(err);
				}
				//se o novo caractere
				//é um '*'
				if(caractere == '*'){
					//é um bloco de comentários
					bloco_comentario = true;
					//leia o próximo caractere
					fseek(arquivo,1,SEEK_CUR);
					caractere = fgetc(arquivo);
					fseek(arquivo,-1,SEEK_CUR);
				}else if(caractere == '/'){
					//comentário estilo C++
					do{
						//leia um caractere
						fseek(arquivo,1,SEEK_CUR);
						caractere = fgetc(arquivo);
						fseek(arquivo,-1,SEEK_CUR);
						if(caractere == EOF){
							sair(err);
						}
						//enquanto não chegar em nova linha
					}while(caractere != '\n');
					nova_linha = true;
					//leia um caractere
					fseek(arquivo,1,SEEK_CUR);
					caractere = fgetc(arquivo);
					fseek(arquivo,-1,SEEK_CUR);
				}
			}
		}
		if(!bloco_comentario){
			//é necessário identar?
			if((nova_linha)&&(caractere == ' ')){
				do{
					//troque o ' ' por '\t'
					fputc('\t',arquivo);
					//leia o próximo caractere
					caractere = fgetc(arquivo);
					fseek(arquivo,-1,SEEK_CUR);
					if(caractere == EOF){
						sair(err);
					}
					//enquanto a corrente
					//de ' 's não acabar
				}while(caractere == ' ');
			}
		}else{
			//veja se o bloco de
			//comentários acabou
			if(caractere == '*'){
				//leia o próximo
				fseek(arquivo,1,SEEK_CUR);
				caractere = fgetc(arquivo);
				fseek(arquivo,-1,SEEK_CUR);
				if(caractere == EOF){
					sair(err);
				}
				if(caractere == '/'){
					//acabou o bloco de comentários
					bloco_comentario = false;
					//leia mais um caractere
					caractere = fgetc(arquivo);
					fseek(arquivo,-1,SEEK_CUR);
				}
			}
		}
		if(caractere == '\n'){
			nova_linha = true;
		}else{
			nova_linha = false;
		}
		fseek(arquivo,1,SEEK_CUR);
	}while(caractere != EOF);
	printf("Arquivo %s indentado.\n",nome_arquivo);
	sair(err);
	return EXIT_SUCCESS;
}
